package com.cleanvegetable.mq;

import com.cleanvegetable.company.entity.Company;
import com.cleanvegetable.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

/**
 * 公司信息消息生产者
 * @author cleanvegetable
 */
@Slf4j
@Component
public class CompanyProducer {

    private final RabbitTemplate rabbitTemplate;

    public CompanyProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    /**
     * 发送公司信息变更消息
     * @param company 公司信息
     * @param operationType 操作类型：create-新增，update-修改，delete-删除
     */
    public void sendCompanyMessage(Company company, String operationType) {
        try {
            log.info("开始发送公司信息变更消息，公司ID：{}，操作类型：{}", company.getId(), operationType);
            
            // 创建correlationData用于消息发送确认
            CorrelationData correlationData = new CorrelationData(company.getId().toString());
            
            // 构建消息体，包含公司信息和操作类型
            CompanyMessage message = new CompanyMessage();
            message.setCompany(company);
            message.setOperationType(operationType);
            message.setTimestamp(System.currentTimeMillis());
            
            // 发送消息到交换机（使用扇形交换机，会广播到所有绑定的队列）
            rabbitTemplate.convertAndSend(
                RabbitMQConfig.COMPANY_EXCHANGE,
                "", // 扇形交换机不需要路由键
                message,
                correlationData
            );
            
            log.info("公司信息变更消息发送成功，公司ID：{}", company.getId());
        } catch (Exception e) {
            log.error("公司信息变更消息发送失败，公司ID：{}，错误信息：{}", company.getId(), e.getMessage());
            throw new RuntimeException("消息发送失败", e);
        }
    }
} 